home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume89 / dos / bindnams.1 next >
Text File  |  1989-03-16  |  29KB  |  700 lines

  1. Path: xanth!ukma!mailrus!bbn!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v89i079:  bindnames - intelligent logical name assignment
  5. Message-ID: <12302@swan.ulowell.edu>
  6. Date: 16 Mar 89 20:47:40 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 689
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: cbmvax!daveh (Dave Haynie)
  12. Posting-number: Volume 89, Issue 79
  13. Archive-name: dos/bindnames.1
  14.  
  15. Here's a program I whipped up to more intelligently handle logical
  16. name assignments in a Startup-Sequence.  It reads all the files from
  17. the "SYS:Names" directory, each of which has one or more lines logical
  18. to physical assignments.  It sorts them according to dependencies,
  19. then makes all the name assignments.  This managed to get every single
  20. "Assign" command out of my Startup-Sequence, and it makes adding new
  21. names a simple matter of dropping a new "names" file into SYS:Names.
  22. This compiles under Lattice C V5.02 (binary included), and is fully
  23. public domain.
  24.  
  25. [uuencoded executable included.  ..Bob]
  26.  
  27. #    This is a shell archive.
  28. #    Remove everything above and including the cut line.
  29. #    Then run the rest of the file through sh.
  30. #----cut here-----cut here-----cut here-----cut here----#
  31. #!/bin/sh
  32. # shar:    Shell Archiver
  33. #    Run the following text with /bin/sh to create:
  34. #    BindNames.c
  35. #    BindNames.uu
  36. #    Makefile
  37. #    ReadMe
  38. # This archive created: Thu Mar 16 15:43:50 1989
  39. cat << \SHAR_EOF > BindNames.c
  40. /* ====================================================================== */
  41.  
  42. /*    BindNames.c by Dave Haynie
  43.  
  44.     This is a simple utility to remove some of the drudgery of program
  45.     installation.  Instead of having to edit a Startup-Sequence for
  46.     every logical name that must be used by a new program, this lets
  47.     names be block-allocated.  The BindNames program looks for files
  48.     in the SYS:Names directory.  Each of these files contains any number
  49.     of lines of the form:
  50.     
  51.         Name:    Path
  52.     
  53.     Where "Name" is the logical name we're assigning, "Path" is the
  54.     path name we're making equivalent.  
  55. */
  56.  
  57. #include <exec/types.h>
  58. #include <exec/memory.h>    
  59. #include <libraries/dos.h>
  60. #include <libraries/dosextens.h>
  61. #include <proto/all.h>
  62. #include <stdio.h>
  63. #include <ctype.h>
  64. #include <stdlib.h>
  65. #include <string.h>
  66.  
  67. /* ====================================================================== */
  68.  
  69. /* Macros */
  70.  
  71. #define CADDR(x)    ((BPTR)(((ULONG)x)>>2))
  72. #define NAMEDIR        "SYS:Names"
  73. #define CopyStr(s)    strcpy(malloc(strlen(s)+1),s)
  74. #define FreeStr(s)    free(s)
  75.  
  76. /* The "-rr" option doesn't like NewList, bit it's real simple.  WHEN can
  77.    we have inline functions.... */
  78.  
  79. #define NewList(l)    { (l)->lh_Head     = (struct Node *)&(l)->lh_Tail; \
  80.               (l)->lh_TailPred = (struct Node *)&(l)->lh_Head; \
  81.               (l)->lh_Tail     = NULL;        \
  82.             }
  83.  
  84. /* ====================================================================== */
  85.  
  86. /* Global variables */
  87.  
  88. extern struct DosLibrary *DosBase = NULL;
  89. struct DosInfo *info = NULL;
  90. struct DeviceList *lastdev;
  91. BPTR namelock = NULL;
  92. BOOL verbose = FALSE;
  93. BOOL test = FALSE;
  94. struct FileInfoBlock *fileinfo = NULL;
  95.  
  96. /* ====================================================================== */
  97.  
  98. /* This function makes a BCPL string into a C style string. */
  99.  
  100. char *b2cstr(char *cstr, BPTR bptr) {
  101.    char *ptr = (char *)BADDR(bptr);
  102.    strncpy(cstr,ptr+1,*ptr);
  103.    cstr[*ptr] = '\0';
  104.    return cstr;       
  105. }
  106.  
  107. /* This function allocates things in a DOS friendly way. */
  108.  
  109. void *DOSAlloc(LONG size) {
  110.    LONG *ptr = AllocMem(size+4,MEMF_PUBLIC|MEMF_CLEAR);
  111.    *ptr = size+4;
  112.    return ptr+1;
  113. }
  114.  
  115. /* This function frees memory in a DOS friendly way. */
  116.  
  117. void DOSFree(void *mem) {
  118.    LONG *ptr = (LONG *)mem;
  119.    FreeMem(ptr-1,*(ptr-1));
  120. }
  121.  
  122. /* ====================================================================== */
  123.  
  124. /* Here we manage name trees.  Name nodes are built from the device list
  125.    first.  All primary nodes based on the device list have NULL paths,
  126.    indicating that they are primary and thus, don't need to be recreated.
  127.    Subsequent nodes are added to the node that they depend on.  If a node 
  128.    is encountered that doesn't have a parent listed yet, it will be place
  129.    on a temporary node list. */
  130.  
  131. struct NameNode {
  132.    struct Node node;
  133.    struct NameNode *parent;
  134.    struct List children;
  135.    char *path;
  136. };
  137.  
  138. struct List Names;
  139. struct NameNode *lostnodes;
  140.  
  141. /* This function creates a name node, allocating whatever memory is 
  142.    needed. */
  143.  
  144. struct NameNode *MakeNode(char *name, char *path) {
  145.    struct NameNode *nn;
  146.    
  147.    if (!(nn = calloc(1,sizeof(struct NameNode)))) return NULL;
  148.    if (name) nn->node.ln_Name = CopyStr(name);
  149.    NewList(&nn->children);
  150.    if (path) nn->path = CopyStr(path);
  151.    return nn;
  152. }
  153.  
  154. /* This function finds a particular name in the Names data base, via a 
  155.    depth-first search.  If it finds the name, it returns that node, 
  156.    otherwise, it returns NULL. */
  157.  
  158. struct NameNode *FindNode(struct List *lst,char *name) {
  159.    struct Node *n;
  160.    struct NameNode *nn;
  161.    
  162.    for (n = lst->lh_Head; n->ln_Succ; n = n->ln_Succ) {
  163.       if (!(stricmp(name,n->ln_Name))) return (struct NameNode *)n;
  164.       if (nn = FindNode(&((struct NameNode *)n)->children,name)) return nn;
  165.    }
  166.    return NULL;
  167. }
  168.  
  169. /* This is the node assignment routine.  It accepts a node name and a path
  170.    for assignment.  It handles all the proper node creations to add that
  171.    information to the node data base. */
  172.    
  173. void DefNode(char *name, char *path) {
  174.    struct NameNode *nn, *parent;
  175.    char pardev[64];
  176.    int i;
  177.    
  178.    for (i = 0; path[i] != ':' && i < 63; ++i) pardev[i] = path[i];
  179.    pardev[i] = '\0';
  180.    if (!(parent = FindNode(&Names,pardev))) {
  181.       AddHead(&lostnodes->children,(struct Node *)(parent=MakeNode(pardev,NULL)));
  182.       parent->parent = lostnodes;
  183.    }
  184.    
  185.    if (!(nn = FindNode(&Names,name)))
  186.       nn = MakeNode(name,path);
  187.    else {
  188.       Remove((struct Node *)nn);
  189.       if (nn->path) FreeStr(nn->path);
  190.       nn->path = CopyStr(path);
  191.    }
  192.  
  193.    AddHead(&parent->children,(struct Node *)nn);
  194. }  
  195.  
  196. /* This function reads in the individual file's data and builds entries
  197.    in the name list based on that data. */
  198.    
  199. void AddFIB(struct FileInfoBlock *fib,char *name) {  
  200.    BPTR file;
  201.    char *buf,*com,*path;
  202.       
  203.    if (buf = AllocMem(fib->fib_Size+1,0L)) {
  204.       if (file = Open(name,MODE_OLDFILE)) {
  205.          Read(file,buf,fib->fib_Size);
  206.          buf[fib->fib_Size] = '\0';
  207.          com = strtok(strupr(buf)," :\t\n");
  208.          path = strtok(NULL," \t\n");
  209.          while (com && path) {
  210.             DefNode(com,path);
  211.             com = strtok(NULL," :\t\n");
  212.             path = strtok(NULL," \t\n");
  213.          }
  214.          Close(file);
  215.       }
  216.       FreeMem(buf,fib->fib_Size+1);
  217.    }
  218. }
  219.  
  220. /* ====================================================================== */
  221.  
  222. /* This function opens up the stuff we need. */
  223.        
  224. BOOL DoInits(void) {
  225.    if (!(DosBase = (struct DosLibrary *)OpenLibrary("dos.library",33L)))
  226.       return FALSE;
  227.    if (!(info = (struct DosInfo *)BADDR(((struct RootNode *)DosBase->dl_Root)->rn_Info)))
  228.       return FALSE;
  229.    if (!(fileinfo = AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC)))
  230.       return FALSE;
  231.           
  232.    return TRUE;
  233. }
  234.  
  235. /* This function cleans up after DoInits. */
  236.  
  237. void CloseUp(int code, char *str) {
  238.    if (str) printf("Error: %s\n",str);
  239.    if (fileinfo) FreeMem(fileinfo,sizeof(struct FileInfoBlock));
  240.    if (namelock) UnLock(namelock);
  241.    if (DosBase) CloseLibrary((struct Library *)DosBase);
  242.    exit(code);   
  243. }
  244.  
  245. /* ====================================================================== */
  246.  
  247. /* This function finds a directory node.  It has the side effect of
  248.    setting "lastdev" to the last device in the global device list. */
  249.  
  250. struct DeviceList *AllocDirNode(char *name) {
  251.    struct DeviceList *dev, *newdev;
  252.    char *str,old[64];
  253.  
  254.   /* Let's see if the assignment has already been made... */
  255.    for (dev = (struct DeviceList *)BADDR(info->di_DevInfo); dev != NULL; 
  256.         dev = (struct DeviceList *)BADDR(dev->dl_Next)) {
  257.       lastdev = dev;
  258.       if (dev->dl_Type != DLT_DIRECTORY) continue;
  259.       b2cstr(old,dev->dl_Name);
  260.       if (!stricmp(old,name)) return dev;
  261.    }
  262.  
  263.   /* Create the new name structure */
  264.    if (!(newdev=DOSAlloc(sizeof(struct DeviceList))) || !(str=DOSAlloc(32L))) {
  265.       if (newdev) DOSFree(newdev);
  266.       return NULL;
  267.    }
  268.    newdev->dl_Type = DLT_DIRECTORY;
  269.    strcpy(str+1,name);
  270.    str[0] = strlen(name);
  271.    newdev->dl_Name = CADDR(str);
  272.    return newdev;
  273. }
  274.  
  275. /* This function does the "Assign" operation. */
  276.  
  277. BOOL Assign(char *name, char *path) {
  278.    BPTR block;
  279.    struct DeviceList *newdev;
  280.  
  281.   /* Let's verify that the path object is really there.  If not, try to make
  282.      the thing. */
  283.    if (!(block = Lock(path,SHARED_LOCK))) {
  284.       if (!(block = CreateDir(path))) return FALSE;
  285.       UnLock(block);
  286.       if (!(block = Lock(path,SHARED_LOCK))) return FALSE;
  287.    }
  288.  
  289.   /* Get a node for this assignment. */
  290.    Forbid();
  291.    newdev = AllocDirNode(name);
  292.  
  293.   /* Make the assignment */
  294.    if (newdev->dl_Lock) {
  295.       Permit();
  296.       UnLock(newdev->dl_Lock);
  297.       newdev->dl_Lock = block;
  298.       newdev->dl_Task = ((struct FileLock *)BADDR(block))->fl_Task;
  299.       return TRUE;
  300.    }
  301.    newdev->dl_Lock = block;
  302.    newdev->dl_Task = ((struct FileLock *)BADDR(block))->fl_Task;
  303.  
  304.    /* Now link it into the device list. */
  305.    newdev->dl_Next = lastdev->dl_Next;
  306.    lastdev->dl_Next = CADDR(newdev);
  307.    Permit();
  308.    return TRUE;
  309. }
  310.  
  311. /* This list takes in a node list, and performs assignments for all non-primary
  312.    nodes in the list, as long as "inhibit" is FALSE. */
  313.  
  314. void AssignList(struct List *lst, int level, BOOL inhibit) {
  315.    struct Node *n;
  316.    struct NameNode *nn;
  317.    
  318.    for (n = lst->lh_Head; n->ln_Succ; n = n->ln_Succ) {
  319.       nn = (struct NameNode *)n;
  320.       if (nn->path) {
  321.          if (!inhibit) Assign(nn->node.ln_Name,nn->path);
  322.          if (verbose || inhibit)
  323.      printf("%*s%-15s%*s%s\2330m\n",level+1,"\23333m",nn->node.ln_Name,
  324.                                        14-level,"\23332m",nn->path);
  325.       }
  326.       if (nn->children.lh_Head->ln_Succ) 
  327.          AssignList(&nn->children,level+2,inhibit);
  328.    }
  329. }
  330.  
  331. /* ====================================================================== */
  332.  
  333. void main(int argc, char *argv[]) {
  334.    char path[256];
  335.    long i;
  336.    struct NameNode *nn;
  337.    struct DeviceList *dev;
  338.  
  339.    if (!DoInits()) CloseUp(5,NULL);
  340.  
  341.   /* Check the command line. */
  342.    for (i = 1; i < argc; ++i)
  343.       switch (toupper(argv[i][0])) {
  344.          case 'S':
  345.             Assign("SYS",argv[++i]);
  346.             break;
  347.          case 'V':
  348.             verbose = TRUE;
  349.             break;
  350.          case 'T':
  351.             test = TRUE;
  352.             verbose = TRUE;
  353.             break;
  354.          case '?':
  355.             printf("\2337mBindNames V1.0 by Dave Haynie\2330m\n\n");
  356.             printf("Usage: %s [VERBOSE] [TEST] [SYSTEM drive]\n",argv[0]);
  357.             CloseUp(0,NULL);
  358.       }
  359.       if (verbose) printf("\2337mBindNames V1.0 by Dave Haynie\2330m\n\n");
  360.       
  361.   /* Let's build the internal device list.  We know this list is going to be
  362.      a flat list; everything is primary, and thus hung from the root list. */
  363.    NewList(&Names);
  364.    Forbid();
  365.    for (dev = (struct DeviceList *)BADDR(info->di_DevInfo); dev != NULL; 
  366.         dev = (struct DeviceList *)BADDR(dev->dl_Next)) {
  367.       if (!(nn = MakeNode(strupr(b2cstr(path,dev->dl_Name)),NULL))) continue;
  368.       AddHead(&Names,(struct Node *)nn);
  369.    }
  370.    Permit();
  371.    
  372.   /* I need to build the "lostnodes" node.  In order to avoid name collisions,
  373.      I make the name of this node '\0'.  We never need to search for it by
  374.      name... */
  375.  
  376.    AddTail(&Names,(struct Node *)(lostnodes = MakeNode("\0",NULL)));
  377.     
  378.   /* Here I build the list of required assignments by walking through the
  379.      SYS:Names directory, and reading each file. */
  380.   
  381.     if ((namelock = Lock(NAMEDIR,SHARED_LOCK))) {
  382.       Examine(namelock,fileinfo);
  383.       while (ExNext(namelock,fileinfo) || IoErr() != ERROR_NO_MORE_ENTRIES) {
  384.          if (fileinfo->fib_DirEntryType > 0) continue;
  385.          strcat(strcat(strcpy(path,NAMEDIR),"/"),fileinfo->fib_FileName);
  386.          AddFIB(fileinfo,path);
  387.       }
  388.    }
  389.  
  390.   /* Now I've got everything; let's see what's actually here. */
  391.   
  392.    Remove((struct Node *)lostnodes);
  393.  
  394.    if (verbose) printf("Assigned Names:\n");
  395.    AssignList(&Names,1,test);
  396.    if (lostnodes->children.lh_Head->ln_Succ) {
  397.       if (verbose) printf("\n");
  398.       printf("Warning: Can't Resolve Names:\n");
  399.       AssignList(&lostnodes->children,1,TRUE);
  400.    }
  401.    CloseUp(0,NULL);
  402. }
  403. SHAR_EOF
  404. cat << \SHAR_EOF > BindNames.uu
  405.  
  406. begin 644 BindNames
  407. M```#\P`````````#``````````(```@@`````````64```/I```(("1()`!)V
  408. M^0````!'^0```PAR`"`\````HV`")L%1R/_\+'@`!"E.`T`I3P-(0JP#1"9N`
  409. M`11P`"(\```P`$ZN_LXI:P"8`SQ*JP"L9P``<"`/D*\`!`:`````@"E``PQA/
  410. M``$N(&L`K-'(T<@B:``0T\G3R2`"<@`2&2E)`U#0@5*`0F=2@`)`__Z?P%6`_
  411. M0G<(`"`"4X#4@1^R```@`%."4<C_]A^\`"`@`%."'[$@`"``4<K_^")/+PE@Z
  412. M``!X*6L`.@,,<']2@-&L`PQA``#"0>L`7$ZN_H!!ZP!<3J[^C"E``T0O`"1`8
  413. M("H`)&<2+&P%A"!`(B@``"E!`SQ.KO^"(BH`(&<:)#P```/M3J[_XBE``TQG1
  414. M"N6(($`G:``(`*0@;`-$+PA(;`,((&@`)"EH``0#4$ZZ"(1.NAX@<`!@!"`OL
  415. M``0O`"`L`S1G!"!`3I!.NAX`+'@`!")L!81.KOYB3KH(6DJL`T1G&B(L`TQG,
  416. M!$ZN_]PL>``$3J[_?")L`T1.KOZ&(!\N;`-(3G5P9&"T0_H`$'``3J[]V"E`5
  417. M!81G[$YU9&]S+FQI8G)A<GD`3E7_]"\**T#_^.6`(D!%Z0`!$A%(@4C!+T``3
  418. M!"M(__P@`2)*3KH3LB!O``00$$B`(&W__$(P```@""1?3EU.=4Y5__@O#BM`<
  419. M__Q8@"]```0B/``!``$L>``$3J[_.B!`(*\`!$/H``0@"2Q?3EU.=4Y5__PO4
  420. M#B)(68DK2/_\("C__"QX``1.KO\N+%].74YU3E7_^$CG`#`F2"M)__AP`7(DN
  421. M3KH<J"1`(`IF!'``8&(@"V<@($M*&&;\4XB1RR`(4H!.NA;P($LB0!+89OP@/
  422. M0"5(``I!Z@`6)4@`$D'J`!(E2``:0JH`%B9M__@@"V<@($M*&&;\4XB1RR`('
  423. M4H!.NA:T($LB0!+89OP@0"5(`"`@"DS?#`!.74YU2.<`,"9()$DF4V`@($HBX
  424. M:P`*3KH3%DJ`9@0@"V`40>L`$B)*8=I*@&8()E-*DV;<<`!,WPP`3G5.5?^LF
  425. M2.<!,B9)*TC_L'X`8`84LW@`4H=![?^TT<<D2'`ZL#-X`&<&<#^^@&WD0A)!9
  426. M[`-80^W_M&&.)$`@"F8L(&P#9M#\`!(O2``00>W_M)/)80#^ZB1`(&\`$")*(
  427. M+'@`!$ZN_Q`E;`-F``XK2O_T0>P#6")M_[!A`/].)$`@"F8.(&W_L")+80#^A
  428. MM"1`8#@B2BQX``1.KO\$2JH`(&<((&H`($ZZ%QP@2TH89OQ3B)'+(`A2@$ZZ3
  429. M%:H@2R)`$MAF_"!`)4@`("!M__30_``2(DHL>``$3J[_$$S?3(!.74YU3E7_)
  430. MZ$CG,3(D2"`J`'Q2@"M(_^PK2?_P<@`L>``$3J[_.B9`($LO2``8(`MG``"::
  431. M(BW_\"0\```#[2QL!81.KO_B+@!*AV=H(@<D"R8J`'Q.KO_6(&H`?"`(0C,(Z
  432. M`"!+3KH0@B!`0^P`%$ZZ$+@F0)'(0^P`&DZZ$*PD0&`@($LB2F$`_IJ1R$/L`
  433. M`!Y.NA"6)D"1R$/L`"1.NA"*)$`@"V<$(`IFV"('+&P%A$ZN_]PD;?_L)F\`4
  434. M&"`J`'Q2@")++'@`!$ZN_RY,WTR,3EU.=2\.0^P`*'`A+'@`!$ZN_=@I0```F
  435. M2H!F!'``8"X@;```(&@`(B`H`!CE@"E```1F!'``8!9P0>6(<@%.KO\Z*4``9
  436. M$&8$<`!@`G`!+%].=4Y5__Q(YP`2)D@K0/_\(@MG#"\+2&P`-$ZZ!6103TJL&
  437. M`!!G$")L`!!P0>6(+'@`!$ZN_RY*K``(9PPB+``(+&P%A$ZN_Z9*K```9PPBH
  438. M;```+'@`!$ZN_F(@+?_\3KH5B$S?2`!.74YU3E7_M$CG`#`K2/^T(&P`!"`HQ
  439. M``3E@"9`8#(I2P-4<`&PJP`$9B`@*P`H0>W_N&$`_!9![?^X(FW_M$ZZ$$Y*D
  440. M@&8$(`M@7B`3Y8`F0"`+9LIP+&$`_#(F0"`+9PQP(&$`_"8D0"`*9@X@"V<&(
  441. M($MA`/Q&<`!@+G`!)T``!$'J``$B;?^T$-EF_"!M_[1*&&;\4XB1[?^T(`@4M
  442. M@"`*Y(@G0``H(`M,WPP`3EU.=4CG(3(F2"1)(@IT_BQL!81.KO^L+@!*AV8H%
  443. M(@I.KO^(+@!*AV8$<`!@>"('3J[_IB(*=/Y.KO^L+@!*AV8$<`!@8"QX``1.^
  444. MKO]\($MA`/\&)$`@!^6`)D!*J@`,9R0L>``$3J[_=B(J``PL;`6$3J[_IB5'Z
  445. M``P@:P`,)4@`"'`!8"`E1P`,)6L`#``((&P#5"20(`KDB""`+'@`!$ZN_W9P[
  446. M`4S?3(1.=4Y5__Q(YP$0)D@N`"M!__PF4V!F2JL`(&=&2FW__F8,(&L`"B)KI
  447. M`"!A`/\N2FP`#&8&2FW__F<H(`=2@'(.DH<O*P`@2&P`6"\!+RL`"DAL`%(O`
  448. M`$AL`$!.NA(:3^\`'"!K`!)*D&<00>L`$B`'5(`R+?_^2,%AB"932I-FEDS?T
  449. M"(!.74YU3E7^Y$CG(S(N`"M(_NQA`/U@2D!F"'`%D<AA`/VB?`$D;?[L6(HF.
  450. M;?[L4(M@``"H)E(0$TB`2,!![`(!"#```0@`9PP0$TB`2,!R()"!8`80$TB`P
  451. M2,`F;?[P<B`$00`(:VZPNQ`(9O1.^Q`&````/V```#X```!48```*@```%9@N
  452. M```:````4V````)2AD'L`%XB6V$`_CQ8BF`T.7P``0`,8"QP`3E```XY0``,+
  453. M8"!(;`!B3KH"'B!M_NPND$AL`(A.N@)X<`"1R&$`_/)03U*&6(I8BRM+_O"\E
  454. MAVT`_U)*;``,9PI(;`"T3KH!Z%A/0>P#7"E(`UA![`-8*4@#8)'(*4@#7"QXY
  455. M``1.KO]\(&P`!"`H``3E@"9`8#0@*P`H0>W^]&$`^48@0$ZZ#%@@0)/)80#Y+
  456. MR"1`(`IG#D'L`U@B2BQX``1.KO\0(!/E@"9`(`MFR"QX``1.KO]V0>P`VI/)%
  457. M80#YF"E``V9![`-8(D`L>``$3J[_"D'L`-PB"'3^+&P%A$ZN_ZPI0``(9W0BV
  458. M`"0L`!!.KO^:8$@@;``0("@`!$J`;CQ#[`#F3>W^]"S9+-D\D4/M_O0@24/L+
  459. M`/!.N@TD(&P`$%"(+T@`'"!`(F\`'$ZZ#1`@;``00^W^]&$`^L`B+``()"P`A
  460. M$"QL!81.KO^42H!FI$ZN_WQR=-*!L(%FF")L`V8L>``$3J[_!$IL``QG"DALX
  461. M`/).N@"Z6$\P+``.2,!R`4'L`UC!06$`_4P@;`-F(&@`$DJ09RI*;``,9PI(I
  462. M;`$$3KH`C%A/2&P!!DZZ`((@;`-FT/P`$G`!(@!A`/T86$]P`)'(80#[4DS?6
  463. M3,1.74YU``!.=4YU2.<',"X`)D@L`2`'3KH4GB1`(`IF!'#_8#`(*@`#``-GJ
  464. M#DAX``(@!W(`3KH/Q%A/("H`!"(&($M.NA$Z*@!*K`,@9P1P_V`"(`5,WPS@:
  465. M3G4```````!P84CG`Q`F;P`0($M*&&;\4XB1RRP(?@`>&TJ'9S!3K`%N;18@%
  466. M;`%F0^@``2E)`68@!Q"`<@`2`&#<(`=R`!(`(`%![`%B3KH'\B(`8,AP_T'L2
  467. M`6).N@?D(`9,WPC`3G4``````````'!A3E7_W$CG#S`F;P!$?`!![0`,*TC_P
  468. M\AX;2@=G``$`<"6^`&8``,8>&W``$`=R&%U!:P``AK![$`AF]$[[$`0`9&``Z
  469. M`%``>&```!H`<&```!0`<V````(@;?_R)%@K2/_R8$@@;?_R*!@K2/_R1>W_4
  470. M['H'2H5K%B`$<@_`@4'Z`++1P!204XKHA%.%8.9"+?_M8!@@;?_R*!@K2/_RA
  471. M(`1![?_E3KH+9$7M_^4O"DZZ_NI83]R`8`#_8%*&4ZP!;FT8(&P!9D/H``$I!
  472. M20%F(`<0@'(`$@!@`/]`<``0!T'L`6).N@;N(@!@`/\N4H93K`%N;1@@;`%F*
  473. M0^@``2E)`68@!Q"`<@`2`&``_PYP`!`'0>P!8DZZ!KPB`&``_OQP_T'L`6).7
  474. MN@:L(`9,WPSP3EU.=3`Q,C,T-38W.#E!0T1%1@!.5?_$2.<G,"9()$E^`'P`(
  475. M>@!P`!M\`"#_^W(`*T'_]G3_*T+_\D'M_]`;0/_Q&T#__"M!_^0K0?_H*TC_Q
  476. MS$H39T)P`!`3<AA=06LXL'L0"&;V3OL0!``C8```(``@8```%@`K8```#``MI
  477. M8````GX!8`Y\`6`*>@%@!AM\``'__%*+8+H0$W(PL`%F!E*+&T'_^W`JL!-FY
  478. M$"!20^@`!"2)*U#_]E*+8`P@2T/M__9.N@KXU\`0$W(NL`%F)%*+<"JP$V80V
  479. M(%)#Z``$)(DK4/_R4HM@#"!+0^W_\DZZ"LS7P!`3<FRP`68*&WP``?_Q4HM@K
  480. M"')HL`%F`E*+$!MR`!(`&T#_\'`P74!K``)(LGL`"&;T3OL`!`!C8``"'@!SU
  481. M8``!W`!88``!>`!X8``!<@!P8``!6`!O8``!"@!U8```X`!D8````DHM__%G%
  482. M#"!20^@`!"2)(!!@"B!20^@`!"2)(!`K0/_L;`IR`42M_^PK0?_H2JW_Z&<$I
  483. M<"U@"DH&9P1P*V`"<"`;0/_0<``0!B(M_^B"@'``$`6"@&<(4JW_S%*M_^0@Y
  484. M+?_L(&W_S$ZZ",HK0/_(("W_\DJ`:@9R`2M!__(@+?_((BW_\I*`2.T``O_$D
  485. M;RX@;?_,(DC3P6`"$MA3@&3Z<``0+?_[(BW_Q"!M_\Q@`A#`4X%D^B`M__(K.
  486. M0/_(T:W_Y$'M_]`K2/_,2@=G``%$&WP`(/_[8``!.DHM__%G#"!20^@`!"2)4
  487. M(!!@"B!20^@`!"2)(!`K0/_L8`#_9$HM__%G#"!20^@`!"2)(!!@"B!20^@`0
  488. M!"2)(!`K0/_L2BW__&<2(&W_S!#\`#!R`2M!_^0K2/_,(&W_S$ZZ""`K0/_(P
  489. M8`#_+!M\`##_^R`M__)*@&H&<`@K0/_R2BW_\6<,(%)#Z``$)(D@$&`*(%)#/
  490. MZ``$)(D@$"M`_^Q*+?_\9Q8@;?_,$/P`,!#\`'AR`BM!_^0K2/_,(&W_S$ZZ'
  491. M$-@K0/_(<%BP+?_P9@#^QD'M_]!.N@828`#^NB!20^@`!"2)(E`K2?_,9@A![
  492. M^@#**TC_S"!M_\Q*&&;\4XB1[?_,*TC_Y"`M__)*@&LHL<!O)"M`_^1@'G`!T
  493. M*T#_Y"!20^@`!"2)(!`;0/_00BW_T6`$<`!@>B`M_^0B+?_VLH!L"'0`*T+_=
  494. M]F`$D:W_]DH'9RY3K?_D;11P`"!M_\P0&"M(_\P@;0`(3I!@YE.M__9M/'``,
  495. M$"W_^R!M``A.D&#L4ZW_]FT.<``0+?_[(&T`"$Z08.Q3K?_D;11P`"!M_\P0(
  496. M&"M(_\P@;0`(3I!@YB`+3-\,Y$Y=3G4``$Y5__9(YP$P)D@D22MM``C_]AX:C
  497. M2@=G+G`EO@!F(+`29@12BF`8+PL@2D/M__9A`/OV6$\K0/_Z9P0D0<``0H
  498. M!TZ38,Q,WPR`3EU.=4Y5_^Q(YR$R)D@,K````"`$YFP``((0$W(@L`%G#'()[
  499. ML`%G!G(*L`%F!%*+8.A*$V=D("P$YN6`4JP$YD'L!.[1P"1(<"*P$V8B4HLD_
  500. MBTH39PIP(K`39P12BV#R2A-F"'`!3KH/4&"B0AM@GB2+2A-G&!`3<B"P`6<0P
  501. M<@FP`6<*<@JP`6<$4HM@Y$H39@)@!D(;8`#_=DJL!.9F!B!L`T1@!$'L!.XI^
  502. M2`3J2JP$YF8``(!!^@$D0^P$K"+8(M@BV"+8,I`B;`-$(&D`)"](`!1P*$'LW
  503. M!*PL;P`4(FX`!$ZZ!-A![`2L(@@D/````^XL;`6$3J[_XBE``W`I0`-X<@0I,
  504. M00-T*4`#@"E!`WSE@)/)+'@`!"M`__!.KO[:(&W_\")`(V@`"`"D?@`K0/_T5
  505. M8"HL;`6$3J[_RBE``W!.KO_$*4`#>$'Z`*0B""0\```#[4ZN_^(I0`.`?@0@S
  506. M!P!`@`&!K`-L(`<`0(`"@:P#=`"L``"``P-\2JP!J&<$<`!@!B`\``"``"X`)
  507. M0JP!7"`'`$```2E``5AP`2E``7X@!P!```(I0`%Z<`(I0`&@(`<`0`"`*4`!H
  508. MG$'Z"Y@I2`,X("P$YB!L!.I.NO64<`!.N@DR3-],A$Y=3G5C;VXZ,3`O,3`O=
  509. M,S(P+S@P+P`J`````````````````````````````````````````'!A+PLFV
  510. M2$JK`!1G#`@K``,`&V8$<`!@-"`L`P1.N@BD)T``!"=``!!*@&8*<`PI0`6`0
  511. M</]@%B=L`P0`%'#SP:L`&'``)T``#"=```@F7TYU``````````````````!.B
  512. M5?_L2.<O$"X`)D@H!W`QP*L`&&<&</]@``)0""L`!P`:5L!$`$B`2,`L`$JK*
  513. M`!1F``"`""L``@`;9G9P`"=```QR_[Z!9P`"(B!+3KK_5DJ`9PP(ZP`%`!MP,
  514. M_V```@P(ZP`!`!M*!F<.("L`%"(`1($G00`,8`@@*P`4)T``#%.K``QM%B!K-
  515. M``1#Z``!)TD`!"`'$(!R`!(`8!`@!W(`$@`@`2!+80#_6"(`(`%@``&Z""L`/
  516. M`@`;9TQP_[Z`9@9P`&```:8@!QM`__]*!F<<<@J^@686<@(K0?_P("L`'$'Z;
  517. M`9!.NO:**@!@%'(!*T'_\"`K`!Q![?__3KKV="H`?O]@``#2".L``0`;2@9GI
  518. M3G#_OH!G2%2K``QR"KZ!9B(@:P`$0^@``2=)``00O``-(BL`#$J!:P8@2V$`A
  519. M_L12JP`,(&L`!$/H``$G20`$(`<0@"(K``Q*@6L``1!^_R`K``20JP`0*T#_2
  520. M\&=H""L`!@`:9TQ(>``"("L`''(`3KH%X%A/*T#_[$H&9S13K?_L;2Y"IR`KO
  521. M`!PB+?_L3KH%PB`K`!QR`4'M__U.N@3`6$]*K`,@9@H0+?_]<AJP`6?,("L`9
  522. M'"(M__`@:P`03KKUHBH`8`)Z`'#_NH!F"`CK``4`&V`,NJW_\&<&".L`!``;%
  523. M2@9G#B(K`!0D`42")T(`#&`8""L``@`;9PAR`"=!``Q@""(K`!0G00`,(&L`K
  524. M$"=(``2^@&<L4ZL`#&T6(&L`!$/H``$G20`$(`<0@'(`$@!@$"`'<@`2`"`!'
  525. M($MA`/VR(@!P,,"K`!AG!'#_8`QP_[B`9@1P`&`"(`1,WPCT3EU.=0T*````Y
  526. M`$CG(#`F2"1+2A)G)'``$!)![`(!"#```0@`9PIR`!(`=""2@F`$<@`2`!2!@
  527. M4HI@V"`+3-\,!$YU````````<&%.5?_P2.<!,"9(*TG_\"`+9QH@2RE(!7!.<
  528. MN@(:+@`@;`5P(DC3QRM)__A@$"!L!7!*$&8$<`!@/BM(__@D;?_X($HB;?_P1
  529. M3KH"`BX`2C)X`&<80C)X`"!*T<=%Z``!($HB;?_P3KH!SBX`($K1QRE(!7`@^
  530. M+?_X3-\,@$Y=3G4``"((8`00V6<(4X!D^&`&0AA3@&3Z(`%.=4Y5__A(YP,PO
  531. M)D@D22X`($I*&&;\4XB1RBP(($M*&&;\4XB1RR`((DO3P"M)__B\AV,"+`<@5
  532. M!B!*8`(2V%.`9/H@;?_X0C!H`"`+3-\,P$Y=3G4``'``<@`0&!(9#```86T*T
  533. M#```>FX$!```(`P!`&%M"@P!`'IN!`0!`""0@68$2@%FU$YU```@"$H89OQ3A
  534. MB!#99OQ.=0``3E7_]")/<@I.N@9D!D$`,!+!2H!F\"`)$.&_R6;Z0A"0CTY=3
  535. M3G4``$Y5__0B3R(``D$`!P9!`#`2P>:(9O`@"1#AO\EF^D(0D(].74YU``!.S
  536. M5?_T(D]L!A#\`"U$@'(*3KH&#`9!`#`2P4J`9O`0X;_)9OI"$"`(3EV0KP`$I
  537. M3G5.5?_X2.<!,"9()$E^`$H39RHK2O_\(&W__$H09PP0$+`39P92K?_\8.P@_
  538. M;?_\2A!F!"`'8`A2AU*+8-(@!TS?#(!.74YU3E7_^$CG`3`F2"1)?@!*$V<BH
  539. M*TK__"!M__Q*$&<0$!"P$V8$(`=@#E*M__Q@Z%*'4HM@VB`'3-\,@$Y=3G5(Q
  540. MYP`P)D@D22!+(DIA`/]N3-\,`$YU2.<`,"9()$D@2R)*89Y,WPP`3G4``"\)3
  541. M(DAR`'``+P(,$``K9P8,$``M9@)22!`8!```,&T2#```"6X,)`'E@=*"TH'2J
  542. M@&#F#!$`+68"1($D'R`(4X`@7R"!D(E.=4Y5_^1(YP$R+@`K2/_D2H=N!G#_7
  543. M8```S'`(OH!D`BX`(`=6@"X``D?__"1(T<??K`$\0^P!."91*TC_\"M)__0@Y
  544. M"V<``)`@2R`K``31P"M(_^PB;?_PM\EC$"2+)4<`!"QM__0LBG``8'BWR68:%
  545. M+%,DCB`K``0B`-*')4$`!"QM__0LBG``8%JUR&0(GZP!/'#_8$ZUR&8L2I-GR
  546. M#B!3L\AC")^L`3QP_V`XWZL`!$J39PZSTV8*("D`!-&K``0FD7``8!XK2__TG
  547. M*VW_[/_H)E-@`/]N(&W_]""*0I(E1P`$<`!,WTR`3EU.=0``````````<&%(,
  548. MYP$0)D@N`"`'($M.NO[^3-\(@$YU``!(YP<P+@`F2"P!(`=.N@6B)$`@"F8$=
  549. M</]@&B`J``0B!B!+3KH#$"H`2JP#(&<$</]@`B`%3-\,X$YU```O!RX`4JP%*
  550. M=%.L`6YM%B!L`69#Z``!*4D!9B`'$(!R`!(`8!(@!W(`$@`@`4'L`6).NODF-
  551. M(@`N'TYU3E4``"\+)F\`#$*L!71(;0`,0?K_LB)+3KKV3G#_0>P!8DZZ^/H@6
  552. M+`5T)FW__$Y=3G5(YP$P+@!*K`5X9Q0D;`5X(!(@;`5X3KK_*)'(*4@%>$J'L
  553. M9@1P`&`<6(<@!TZZ`2(F0$J`9@1P`&`*)$LDAT'K``0@"$S?#(!.=0``2.</E
  554. M$"X`+`$J+P`8(`=.N@2L)D`@"V8$</]@'"\%("L`!"(&3KH!HEA/*`!*K`,@?
  555. M9P1P_V`"(`1,WPCP3G4``````````'!A2.<#,"X`2H=N!G``8```H'`(OH!DV
  556. M`BX`(`=6@"X``D?__$7L`3@F4B`+9T`@*P`$L(=M,K"'9@P@4R2(GZP!/"`+S
  557. M8&H@*P`$D(=R"+"!918@2]'')(@D2"23)4``!)^L`3P@"V!()$LF4V"\(`<BY
  558. M+`<(%3@$ZZ`@0B+`&L3KH!W"P`4(8@!E:`+``"1O_\(`9.N@6,)D`@"V<0?
  559. M(`8@2TZZ_18@!V$`_UA@`G``3-\,P$YU````````<&$O!RX`(`=.NO\\+A].1
  560. M=0``+PLF2"`+9PYP`$ZZ_I0@2UF(*4@%>'``)E].=0```````'!A2.<#$"X`Z
  561. M1^P!0"`+9S`(*P`"`!MF)`@K``$`&V<<("L`!)"K`!`L`$J&9PX@*P`<(@8@<
  562. M:P`03KKNH"938,P@!TZZ!'),WPC`3G4``$CG-Q`N`"9(+`%*K`,X9P1.N@-JA
  563. M0JP#("(')`LF!BQL!81.KO_0*@!P_[J`9@Y.KO]\*4`#('`%*4`%@"`%3-\(&
  564. M[$YU2.<_`"X`+`$J+P`<2JP#.&<$3KH#)$*L`R`@!5.`(@<D!B8`+&P%A$ZN7
  565. M_[XH`'#_N(!F#DZN_WPI0`,@<!8I0`6`(`4,@`````)G%@R``````6<(2H!F3
  566. M&"`&8!0@!-"&8`XB!W0`=@`L;`6$3J[_ODS?`/Q.=0``2.<W$"X`)D@L`4JLF
  567. M`SAG!$ZZ`JY"K`,@(@<D"R8&+&P%A$ZN_]8J`'#_NH!F#DZN_WPI0`,@<`4I-
  568. M0`6`(`5,WPCL3G4O!RX`2JP#.&<$3KH"<"('+&P%A$ZN_]QP`"X?3G4``$CG6
  569. M,``D`"8!2$)(0\3!QL#`P=1#2$)"0M""3-\`#$YU2H!J```>1(!*@6H```Q$H
  570. M@6$``"!$@4YU80``&$2`1(%.=4J!:@``#$2!80``!D2`3G4O`DA!-`%F```BZ
  571. M2$!(04A"-`!G```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O`W80#$$`@&0```;AZ
  572. MF5%##$$(`&0```;IF5E##$$@`&0```;EF55#2D%K```&XYE30S0`YJA(0D)"5
  573. MYJI(0X#!-@`P`C0#2$'$P9""9```"%-#T(%D_G(`,@-(0^>X2$#!028?)!].!
  574. M=4Y5_YY(YS,R?@`@;`-0'BC__W!/OH!O`BX`(`=#[?^O8`(2V%.`9/I"-7BOF
  575. MD\DL>``$3J[^VB9`2JL`K&=,("L`K.6`)$`L*@`X2H9F!"PK`*!*AF<T(@9!E
  576. M^@"P)`AV"RQL!81.KO_0($=2AR`(&[P`"@BO(@9![?^O)`@F!RQL!81.KO_0,
  577. M</]@3$JL!7QF$D/Z`(1P`"QX``1.KOW8*4`%?$'M_Z\I2`'02'@`/$AX`/I(Z
  578. M;`'L2&P!V'``(@"1R$/L`<1.N@$R3^\`$%.`9P1P_V`"<`!,WTS,3EU.=2HJ2
  579. M(%5S97(@06)O<G0@4F5Q=65S=&5D("HJ``!#3TY424Y510``04)/4E0`*BHJX
  580. M($)R96%K.B``:6YT=6ET:6]N+FQI8G)A<GD`````````````````+P<N`'``Y
  581. M*4`#($J':R*^K`$H;!P@!^>`0>P#;$JP"`!G#B`'YX!![`-LT<`@"&`(<`DI3
  582. M0`6`<``N'TYU````````<&%(YP$"<``B/```,``L>``$3J[^SBX``H<``#``=
  583. M2H=F!'``8!Q*K`,X9Q0@;`,X3I!*@&8$<`!@"'`43KH`L"`'3-]`@$YU8;A.\
  584. M=0``2.<'$"X`+`$@!R(&3KK]2BH`(`5.NOI2)D`@"V<.(`5R`"!+8`(0P5.`E
  585. M9/H@"TS?".!.=4CG,#(L;`5\)&\`&"9O`!PD+P`@)B\`)$ZN_J1,WTP,3G4`U
  586. M`&```)).<0``(&\`!&``\(9.<0``,#$R,S0U-C<X.6%B8V1E9E%/(D\R``)!!
  587. M``\2^Q#DZ(AF\B`)(@\0X;*)9OI"$)"!4$].=4CG!P`N`"`L`2A3@"P`2D9K6
  588. M+B`&2,#G@$'L`VPJ,`@`2@5G&`@%``)F$B`&2,#G@$'L`VP@,`@$3KK\7E-&>
  589. M8,X@!TZZX69,WP#@3G5(YP`R)FP%B"`+9Q0D4R)+("L`""QX``1.KO\N)DI@P
  590. MZ)'(*4@%C"E(!8A,WTP`3G5(YP$R+@!P#-Z`(`=R`"QX``1.KO\Z)D`@"V8$6
  591. M<`!@.B='``A%[`6((&H`!"=(``21R":(2I)F`B2+2JH`!&<&(FH`!"*+)4L`+
  592. M!$JL`2QF!"E+`2Q!ZP`,(`A,WTR`3G4```````````````````/L`````@``]
  593. M``(````,````!@````````/R```#Z0````````/R```#Z@```,(`````````9
  594. M`````````````````"`Z"0H``"`)"@`@.@D*```@"0H`9&]S+FQI8G)A<GD`I
  595. M17)R;W(Z("5S"@``)2IS)2TQ-7,E*G,E<YLP;0H`FS,S;0``FS,R;0``4UE3I
  596. M`)LW;4)I;F1.86UE<R!6,2XP(&)Y($1A=F4@2&%Y;FEEFS!M"@H`57-A9V4Z)
  597. M("5S(%M615)"3U-%72!;5$535%T@6U-94U1%32!D<FEV95T*``";-VU":6YD[
  598. M3F%M97,@5C$N,"!B>2!$879E($AA>6YI99LP;0H*````4UE3.DYA;65S`%-9W
  599. M4SI.86UE<P`O`$%S<VEG;F5D($YA;65S.@H```H`5V%R;FEN9SH@0V%N)W0@]
  600. M4F5S;VQV92!.86UE<SH*`````````"@`````````````````````````````@
  601. M`6(```````````````````````````````````````````&$````````````H
  602. M`````````````````````````````````````````````````````````````
  603. M``````````````````"`````!`#__P````X`#@```````!X2`````/__````,
  604. M!``$``````````````&P__\````$``0````````>+@````#__P````0`!```1
  605. M`````!XX```````@("`@("`@("`H*"@H*"`@("`@("`@("`@("`@("`@($@06
  606. M$!`0$!`0$!`0$!`0$!"$A(2$A(2$A(2$$!`0$!`0$(&!@8&!@0$!`0$!`0$!&
  607. M`0$!`0$!`0$!`0$!$!`0$!`0@H*"@H*"`@("`@("`@("`@("`@("`@("`@(0P
  608. M$!`0("`@("`@("`@("@H*"@H("`@("`@("`@("`@("`@("`@2!`0$!`0$!`0`
  609. M$!`0$!`0$(2$A(2$A(2$A(00$!`0$!`0@8&!@8&!`0$!`0$!`0$!`0$!`0$!=
  610. M`0$!`0$0$!`0$!""@H*"@H("`@("`@("`@("`@("`@("`@("`A`0$!`@````Y
  611. M```"`````^P````#`````````?@```'D```!O`````,````"```!U````6(`,
  612. +``%``````````_(#Y
  613. ``
  614. end
  615. size 9236
  616. SHAR_EOF
  617. cat << \SHAR_EOF > Makefile
  618. # Really cheap Makefile for BindNames.c
  619.  
  620. BindNames:    BindNames.c
  621.     lc -Lt -O -rr -ms -v BindNames
  622.  
  623. SHAR_EOF
  624. cat << \SHAR_EOF > ReadMe
  625.  
  626.  
  627.         BindNames V1.0 by Dave Haynie
  628.  
  629.  
  630.     BindNames is a rather simple hack I came up with to solve the
  631. "Assign" problem.  Like most folks with large hard disks containing lots
  632. of different programs, my Startup-Sequence was starting to get full of
  633. Assign statements.  While that alone isn't necessarily enough to make
  634. most go out and write a program, I was starting to think of this as an
  635. inelegance.  Nearly every other new program I installed onto my system
  636. needed a new set of logical names, and so for every new program I ended
  637. up having to edit my Startup-Sequence.  I also had to pay attention to
  638. the ordering of Assignments, since obviously I couldn't base an
  639. assignment on one that hadn't been made yet.  The end result was that
  640. the Startup Sequence was getting rather ugly, with no sign of change on
  641. the immediate horizon. 
  642.  
  643.     Since problems should be solved by those who see them, I came up
  644. with BindNames.  BindNames is designed to do all of the logical name
  645. assignments you need at once.  It looks for any number of files in the
  646. directory "SYS:Names".  The format of such files is something like this
  647. (to quote my "SYS:Names/System" file):
  648.  
  649. BIN:    SYS:bin
  650. OS:    SYS:os
  651. C:     BIN:c
  652. COM:    BIN:Com
  653. L:     OS:L
  654. FONTS:    PATH:FD:Amiga,FD:PD,FD:PS,FD:Terms,FD:CityDesk
  655. FD:    OS:Fonts
  656. S:     OS:s
  657. DEVS:    OS:Devs
  658. LIBS:    OS:Libs
  659. ENV:    RAM:Env
  660. T:    RAM:T
  661.  
  662.     BindNames will read all name files before making any
  663. assignments, and it can figure out dependencies, so it doesn't matter
  664. how you order the names.  It will create directories that it can't find,
  665. such as RAM:Env and RAM:T in the above example, and it will generate
  666. warnings for name assignments that it can't resolve.  It also accepts
  667. several options, of the form:
  668.  
  669.     BindNames [SYSTEM device] [VERBOSE] [TEST]
  670.  
  671.     The SYSTEM device option causes BindNames to re-assign the SYS:
  672. name to the given device before searching for SYS:Names.  For example,
  673. my main system disk is called FH0:, but I boot from DH2: (sure sounds
  674. like A2090A madness to me too, but what can I say), so my
  675. Startup-Sequence says "BindNames >NIL: SYSTEM fh0:". 
  676.  
  677. The VERBOSE switch causes BindNames to list each name and equivalence
  678. as it runs.  The TEST switch does the same thing, but doesn't actually
  679. make the name assignments.
  680.  
  681.     Using BindNames, I've managed to get every single "Assign"
  682. command out of my Startup-Sequence.  And if I need to add a series of
  683. assignments for a new program, I can just create a SYS:Names file for
  684. that program.  That makes installing the program much easier, and also
  685. keeps all the logical names for a particular program in an obvious
  686. location, which makes modifying the system setup much simpler in the
  687. future. 
  688.  
  689.     BindNames is public domain, do with as you please.
  690.  
  691.  
  692.                     -Dave Haynie
  693.                      3/14/89
  694. SHAR_EOF
  695. #    End of shell archive
  696. exit 0
  697. -- 
  698. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  699. Have five nice days.
  700.